package ipebg.mzk.common.core.dao;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

import redis.clients.jedis.BinaryClient.LIST_POSITION;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.SortingParams;
import redis.clients.jedis.Tuple;

public interface IRedisDao {
	 abstract Jedis getRedisClient();
	 void returnResource(Jedis jedis);
	 void returnResource(Jedis jedis,boolean broken);


	 void disconnect();

		String set(String key, String value);

		Long hincrBy(String key, String field, long value);

		List<String> hmget(String key, String[] fields);

		String hmset(String key, Map<String, String> hash);

		Long hsetnx(String key, String field, String value);

		String hget(String key, String field);

		Long hset(String key, String field, String value);

		String substr(String key, int start, int end);

		Long append(String key, String value);

		Long incr(String key);

		boolean getbit(String key, long offset);

		String get(String key);

		String type(String key);

		Long expireAt(String key, long unixTime);

		long setrange(String key, long offset, String value);

		Long setnx(String key, String value);

		String setex(String key, int seconds, String value);

		Long expire(String key, int seconds);

		Long ttl(String key);

		String getSet(String key, String value);

		String getrange(String key, long startOffset, long endOffset);

		Long decrBy(String key, long integer);

		Long decr(String key);

		boolean setbit(String key, long offset, boolean value);

		Boolean exists(String key);

		Boolean hexists(String key, String field) ;
		
		Long del(String key);
		
		Long hdel(String key, String field);
		
		Long hlen(String key);
		
		Set<String> hkeys(String key);
		
		List<String> hvals(String key);
		
		Map<String, String> hgetAll(String key);
		
		/**
		 * List操作,在底部加一个元素
		 * @param key
		 * @param string
		 * @return
		 */
		Long rpush(String key, String string);
		
		/**
		 * List操作,在顶部加一个元素
		 * @param key
		 * @param string
		 * @return
		 */
		Long lpush(String key, String string);
		
		
		/**
		 * List 操作,获得list长度
		 * @param key
		 * @return
		 */
		Long llen(String key);
		
		List<String> lrange(String key, long start, long end);
		
		String ltrim(String key, long start, long end);
		
		/**
		 * List操作,通過索引,獲得list中項
		 * @param key
		 * @param index
		 * @return
		 */
		String lindex(String key, long index);
		
		String lset(String key, long index, String value);
		
		Long lrem(String key, long count, String value);
		
		String lpop(String key);
		
		String rpop(String key);
		
		Long sadd(String key, String member);
		Set<String> smembers(String key);
		Long srem(String key, String member);
		String spop(String key);
		Long scard(String key);
		Boolean sismember(String key, String member);
		String srandmember(String key);
		Long zadd(String key, double score, String member);
		Set<String> zrange(String key, int start, int end);
		Long zrem(String key, String member);
		Double zincrby(String key, double score, String member);
		Long zrank(String key, String member);
		Long zrevrank(String key, String member);
		Set<String> zrevrange(String key, int start, int end);;
		Set<Tuple> zrangeWithScores(String key, int start, int end);
		Set<Tuple> zrevrangeWithScores(String key, int start, int end);
		Double zscore(String key, String member);
		Long zcard(String key);
		List<String> sort(String key);
		List<String> sort(String key, SortingParams sortingParameters) ;
		
		/**
		 * 有序集操作,计算一个有序集合成员与给定值范围内的分数
		 * @param key
		 * @param min
		 * @param max
		 * @return
		 */
		Long zcount(String key, double min, double max) ;
		
		/**
		 * 有序集操作,按分数返回一个成员范围的有序集合
		 * @param key
		 * @param min
		 * @param max
		 * @return
		 */
		Set<String> zrangeByScore(String key, double min, double max) ;
		
		/**
		 * 有序集操作,返回一个成员范围的有序集合，按分数，以分数排序从高分到低分
		 * @param key
		 * @param max
		 * @param min
		 * @return
		 */
		Set<String> zrevrangeByScore(String key, double max, double min);
		
		
		/**
		 * 有序集操作,返回带偏移量的,定长的 一个成员范围的正序有序集合
		 * @param key
		 * @param min
		 * @param max
		 * @param offset 相对于0的偏于个数
		 * @param count
		 * @return
		 */
		Set<String> zrangeByScore(String key, double min, double max, int offset, int count) ;
		
		/**
		 * 有序集操作,返回带偏移量的,定长的 一个成员范围的倒序有序集合
		 * @param key
		 * @param max
		 * @param min
		 * @param offset
		 * @param count
		 * @return
		 */
		Set<String> zrevrangeByScore(String key, double max, double min, int offset, int count);
		
		/**
		 * 有序集操作,按分数返回一个成员范围的有序集合,并带有score值
		 * @param key
		 * @param min
		 * @param max
		 * @return
		 */
		Set<Tuple> zrangeByScoreWithScores(String key, double min, double max);
		
		/**
		 *  有序集操作,按分数返回一个成员范围的倒序集合,并带有score值
		 * @param key
		 * @param max
		 * @param min
		 * @return
		 */
		Set<Tuple> zrevrangeByScoreWithScores(String key, double max, double min);
		
		/**
		 * 有序集操作,返回带偏移量的,定长的 一个成员范围的有序集合 ,并带有score值,
		 * @param key
		 * @param min
		 * @param max
		 * @param offset
		 * @param count
		 * @return
		 */
		Set<Tuple> zrangeByScoreWithScores(String key, double min, double max, int offset, int count);
		
		/**
		 * 有序集操作,返回带偏移量的,定长的 一个成员范围的倒序有序集合 ,并带有score值,
		 * @param key
		 * @param max
		 * @param min
		 * @param offset
		 * @param count
		 * @return
		 */
		Set<Tuple> zrevrangeByScoreWithScores(String key, double max, double min, int offset, int count);
		
		/**
		 * 有序集操作,移除有序集中的第start个元素开始(含),第end个元素结束(含)的 项次
		 * @param key
		 * @param start
		 * @param end
		 * @return 返回移除的个数
		 */
		Long zremrangeByRank(String key, int start, int end);
		
		/**
		 * 有序集操作,移除有序集中的 从score = sart 元素开始(含),第n个元素score=end 结束(含)的 项次
		 * @param key
		 * @param start
		 * @param end
		 * @return
		 */
		Long zremrangeByScore(String key, double start, double end);
		
		/**
		 * List 类操作,在现有key的pivot元素的前面或后面增加value新元素
		 * @param key
		 * @param where
		 * @param pivot
		 * @param value
		 * @return
		 */
		Long linsert(String key, LIST_POSITION where, String pivot, String value);
		String set(byte[] key, byte[] value);
		byte[] get(byte[] key);
		Boolean exists(byte[] key);
		String type(byte[] key);
		Long expire(byte[] key, int seconds);
		Long expireAt(byte[] key, long unixTime);
		Long ttl(byte[] key);
		byte[] getSet(byte[] key, byte[] value);
		Long setnx(byte[] key, byte[] value);
		String setex(byte[] key, int seconds, byte[] value);
		Long decrBy(byte[] key, long integer);
		Long decr(byte[] key);
		Long incrBy(byte[] key, long integer);
		Long incr(byte[] key);
		Long append(byte[] key, byte[] value);
		byte[] substr(byte[] key, int start, int end);
		Long hset(byte[] key, byte[] field, byte[] value);
		byte[] hget(byte[] key, byte[] field);
		Long hsetnx(byte[] key, byte[] field, byte[] value);
		String hmset(byte[] key, Map<byte[], byte[]> hash);
		List<byte[]> hmget(byte[] key, byte[]... fields);
		Long hincrBy(byte[] key, byte[] field, long value);
		Boolean hexists(byte[] key, byte[] field);
		Long hdel(byte[] key, byte[] field);
		Long hlen(byte[] key);
		Set<byte[]> hkeys(byte[] key);
		Collection<byte[]> hvals(byte[] key);
		Map<byte[], byte[]> hgetAll(byte[] key);
		Long rpush(byte[] key, byte[] string);
		Long lpush(byte[] key, byte[] string);
		Long llen(byte[] key);
		List<byte[]> lrange(byte[] key, int start, int end);
		String ltrim(byte[] key, int start, int end);
		byte[] lindex(byte[] key, int index);
		String lset(byte[] key, int index, byte[] value);	
		Long lrem(byte[] key, int count, byte[] value);
		byte[] lpop(byte[] key);	
		byte[] rpop(byte[] key);
		Long sadd(byte[] key, byte[] member);
		Set<byte[]> smembers(byte[] key);
		Long srem(byte[] key, byte[] member);
		byte[] spop(byte[] key);
		Long scard(byte[] key);
		Boolean sismember(byte[] key, byte[] member);
		byte[] srandmember(byte[] key);
		Long zadd(byte[] key, double score, byte[] member);
		Set<byte[]> zrange(byte[] key, int start, int end);	
		Long zrem(byte[] key, byte[] member);
		Double zincrby(byte[] key, double score, byte[] member);
		Long zrank(byte[] key, byte[] member);
		Long zrevrank(byte[] key, byte[] member);
		Set<byte[]> zrevrange(byte[] key, int start, int end);
		Set<Tuple> zrangeWithScores(byte[] key, int start, int end);
		Set<Tuple> zrevrangeWithScores(byte[] key, int start, int end);
		Long zcard(byte[] key);
		Double zscore(byte[] key, byte[] member);
		List<byte[]> sort(byte[] key);
		List<byte[]> sort(byte[] key, SortingParams sortingParameters) ;
		Long zcount(byte[] key, double min, double max) ;
		Set<byte[]> zrangeByScore(byte[] key, double min, double max);
		Set<byte[]> zrangeByScore(byte[] key, double min, double max, int offset, int count) ;
		Set<Tuple> zrangeByScoreWithScores(byte[] key, double min, double max);
		Set<Tuple> zrangeByScoreWithScores(byte[] key, double min, double max, int offset, int count);
		Set<byte[]> zrevrangeByScore(byte[] key, double max, double min);
		Set<byte[]> zrevrangeByScore(byte[] key, double max, double min, int offset, int count);
		Set<Tuple> zrevrangeByScoreWithScores(byte[] key, double max, double min);
		Set<Tuple> zrevrangeByScoreWithScores(byte[] key, double max, double min, int offset, int count);
		Long zremrangeByRank(byte[] key, int start, int end);
		Long zremrangeByScore(byte[] key, double start, double end);
		Long linsert(byte[] key, LIST_POSITION where, byte[] pivot, byte[] value);

}
